package 反射.利用数据拆分完成反射调用;

import java.lang.reflect.Method;

/**
 * @author shy_black
 * @date 2019/4/25 9:31
 * @Description:
 */
public class BeanUtil {
    private BeanUtil(){}

    /**
     *
     * @param actionObj 拿到提供给用户使用的xxxAction类
     * @param beanValue 要设置的具体值
     * @throws Exception
     * emp.name:zhangsan|emp.job:Coder
     */
    public static void setBeanValue(Object actionObj,String beanValue) throws Exception {
        String [] temp = beanValue.split("//|");
        for(int i = 0;i < temp.length;i++) {
            //emp.name:zhangsan
            String result[] = temp[i].split(":");
            //emp.name
            //zhangsan
            String realValue = result[1];
            //类名称
            String className = result[0].split("//.")[0];
            //属性名称
            String attrName = result[0].split("//.")[1];
            Object realObj = getRealObject(actionObj,className);
            System.out.println(realObj);
        }
    }
    public static Object getRealObject(Object actionObj,String className) throws Exception {
        //1.取得xxAction class对象
        Class<?> cls = actionObj.getClass();
        //2.拼装getXXX()方法名称
        String methodName = "get" + initCap(className);
        //3.取得该方法名称的Method对象
        Method method = cls.getMethod(methodName);
        //4.通过反射调用该方法
        //等同于empAction.getEmp();
        return ((Method) method).invoke(actionObj);
    }
    private static String initCap(String str) {
        return str.substring(0,1).toUpperCase() + str.substring(1);
    }
}
